/*题目：输入三行字符串，前两行为帧头和帧尾（可以是多个字符），第三行为目标字符串，
将该目标字符串中的合法帧抽取出来。（不包含帧头和帧尾）	
提示：该题目需要用到习题4中的查找子串函数 findStr ();	
输入格式：		
head
tail
asdheadhauboisoktail。

输出格式：
hauboisok

输入格式：
<p>
</p>
<p>24小时闪电访华，马斯克满载而归。他不仅为特斯拉扫清了中国市场的落地障碍，更推动特斯拉股价大幅飙升，为自己拿到了解锁天价薪酬的金钥匙。</p>

输出格式：
24小时闪电访华，马斯克满载而归。他不仅为特斯拉扫清了中国市场的落地障碍，更推动 特斯拉股价大幅飙升，为自己拿到了解锁天价薪酬的金钥匙。
*/
#include<stdio.h>  
#include<string.h>  
#define SIZE 10001  
  
int findStr(char* haystack, char* needle);  
  
int main()  
{  
    char head[SIZE] = {0};  
    char tail[SIZE] = {0};  
    char haystack[SIZE] = {0};  
      
    // 读取帧头和帧尾  
    fgets(head, SIZE, stdin);  
    head[strcspn(head, "\n")] = 0; // 移除fgets读取的换行符  
    fgets(tail, SIZE, stdin);  
    tail[strcspn(tail, "\n")] = 0; // 移除fgets读取的换行符  
  
    // 读取目标字符串  
    fgets(haystack, SIZE, stdin);  
    haystack[strcspn(haystack, "\n")] = 0; // 移除fgets读取的换行符  
  
    char *p = haystack;  
    char *frameStart = NULL;  
  
    // 遍历目标字符串  
    while (*p)  
    {  
        // 查找帧头  
        int startIdx = findStr(p, head);  
        if (startIdx == -1)  
        {  
            break; // 如果没有找到帧头，结束循环  
        }  
  
        // 更新p的位置为帧头之后  
        p += startIdx + strlen(head);  
  
        // 查找帧尾  
        int endIdx = findStr(p, tail);  
        if (endIdx == -1)  
        {  
            // 如果没有找到帧尾，则跳过当前帧头并继续查找  
            p = strchr(p, *head); // 查找下一个可能的帧头  
            if (!p) break; // 如果没有找到下一个帧头，结束循环  
            continue;  
        }  
  
        // 找到完整的帧，打印出来  
        if (frameStart == NULL)  
        {  
            frameStart = p - strlen(head);  
        }  
        printf("%.*s", endIdx, frameStart); // 打印从frameStart开始的endIdx个字符  
  
        // 更新p的位置为帧尾之后  
        p += endIdx + strlen(tail);  
        frameStart = NULL; // 重置frameStart以开始新的帧搜索  
    }  
  
    if (frameStart)  
    {  
        // 如果还有未打印的帧，则打印它  
        printf("%s", frameStart);  
    }  
  
    printf("\n"); // 在所有帧之后打印换行符  
  
    return 0;  
}  
  
int findStr(char* haystack, char* needle)  
{  
    if (!haystack || !needle)  
    {  
        return -1; 
    }  
      
    if (!*needle)  
    {  
        return 0;  
    }  
      
    char *p = haystack;  
    while (*p)  
    {  
        char *q = needle;  
        while (*q && *p == *q)  
        {  
            p++;  
            q++;  
        }  
          
        if (!*q) 
        {  
            return p - haystack - (q - needle); 
        }  
        p++; 
    }  
    return -1; 
}  